
package com.ifips5.nal.epizza.util;

import java.util.*;
import java.text.SimpleDateFormat;
import org.omg.PortableInterceptor.LOCATION_FORWARD;


/**
 * This class contains helper methods for dealing with
 * Date objects.
 */
public final class DateHelper {
    
    
            /**
     * All minutes have this many milliseconds except the last minute of the day on a day defined with
     * a leap second.
     */
    public static final long MILLISECS_PER_MINUTE = 60*1000;
    
    /**
     * Number of milliseconds per hour, except when a leap second is inserted.
     */
    public static final long MILLISECS_PER_HOUR   = 60*MILLISECS_PER_MINUTE;
    
    /**
     * Number of leap seconds per day expect on 
     * <BR/>1. days when a leap second has been inserted, e.g. 1999 JAN  1.
     * <BR/>2. Daylight-savings "spring forward" or "fall back" days.
     */
    protected static final long MILLISECS_PER_DAY = 24*MILLISECS_PER_HOUR;


  
    
    
    public static final int dayDiff(Date date1, Date date2)
    {
	long diff;
	if (date1.before(date2))
	{
	    diff = date2.getTime() - date1.getTime();
	}
	else
	{
	    diff = date1.getTime() - date2.getTime();
	}
	
	Long nbDays = new Long( (long) Math.floor( diff / MILLISECS_PER_DAY) );
	return nbDays.intValue();
    }
    
    public static final int hourDiff(Date date1, Date date2)
    {
	long diff;
	if (date1.before(date2))
	{
	    diff = date2.getTime() - date1.getTime();
	}
	else
	{
	    diff = date1.getTime() - date2.getTime();
	}
	
	Long nbHours= new Long( (long) Math.floor( diff / MILLISECS_PER_HOUR) );
	return nbHours.intValue();
    }
    
    public static final int minutDiff(Date date1, Date date2)
    {
	long diff;
	if (date1.before(date2))
	{
	    diff = date2.getTime() - date1.getTime();
	}
	else
	{
	    diff = date1.getTime() - date2.getTime();
	}
	
	Long nbMinuts= new Long( (long) Math.floor( diff / MILLISECS_PER_MINUTE) );
	return nbMinuts.intValue();
    }
    
    
    public static final String timeDiff(Date date1, Date date2, String day, String hour, String minut, String and)
    {
	long diff;
	
	if (date1.before(date2)){    diff = date2.getTime() - date1.getTime();}
	else			{    diff = date1.getTime() - date2.getTime();}

	
	
	long nbDays = (long) Math.floor( diff / MILLISECS_PER_DAY);
	long diffHours = diff - ( nbDays * MILLISECS_PER_DAY);
	long nbHours = (long)  Math.floor( diffHours / MILLISECS_PER_HOUR);
	long diffMinuts = diffHours - ( nbHours * MILLISECS_PER_HOUR);
	long nbMinuts = (long) Math.floor( diffMinuts / MILLISECS_PER_MINUTE);
	
	if(nbDays != 0)
	{
	    if(nbHours != 0)
	    {
		if(nbMinuts != 0)
		{
		    return nbDays+" "+day+", "+nbHours+" "+hour+" "+and+" "+nbMinuts+" "+minut;
		} else
		{
		    return nbDays+" "+day+" "+and+" "+nbHours+" "+hour;
		}
	    } else
	    {
		if(nbMinuts != 0)
		{
		    return nbDays+" "+day+" "+and+" "+nbMinuts+" "+minut;
		} else
		{
		    return nbDays+" "+day;
		}	    
	    }
	} else
	{
	    if(nbHours != 0)
	    {
		if(nbMinuts != 0)
		{
		    return nbHours+" "+hour+" "+and+" "+nbMinuts+" "+minut;
		} else
		{
		    return nbHours+" "+hour;
		}
	    } else
	    {
		return nbMinuts+" "+minut;
	    }
	}
	
	
    }
    
    public static final String getHour_fr(int nbHours)
    {
	if(nbHours > 1) return "heures";
	return "heure";
    }
    public static final String getDay_fr(int nbDays)
    {
	if(nbDays > 1) return "jours";
	return "jour";
    }
        public static final String getMinut_fr(int nbMinuts)
    {
	if(nbMinuts > 1) return "minutes";
	return "minute";
    }
    
    public static final String timeDiff_fr(Date date1, Date date2)
    {
	long diff;
	
	if (date1.before(date2)){    diff = date2.getTime() - date1.getTime();}
	else			{    diff = date1.getTime() - date2.getTime();}

	
	
	long nbDays = (long) Math.floor( diff / MILLISECS_PER_DAY);
	long diffHours = diff - ( nbDays * MILLISECS_PER_DAY);
	long nbHours = (long)  Math.floor( diffHours / MILLISECS_PER_HOUR);
	long diffMinuts = diffHours - ( nbHours * MILLISECS_PER_HOUR);
	long nbMinuts = (long) Math.floor( diffMinuts / MILLISECS_PER_MINUTE);
	
	if(nbDays != 0)
	{
	    if(nbHours != 0)
	    {
		if(nbMinuts != 0)
		{
		    
		    return nbDays+" "+getDay_fr((new Long(nbDays)).intValue())+", "+nbHours+" "+getHour_fr((new Long(nbHours)).intValue())+" "+"et"+" "+nbMinuts+" "+getMinut_fr((new Long(nbMinuts)).intValue());
		} else
		{
		    return nbDays+" "+getDay_fr((new Long(nbDays)).intValue())+" "+"et"+" "+nbHours+" "+getHour_fr((new Long(nbHours)).intValue());
		}
	    } else
	    {
		if(nbMinuts != 0)
		{
		    return nbDays+" "+getDay_fr((new Long(nbDays)).intValue())+" "+"et"+" "+nbMinuts+" "+getMinut_fr((new Long(nbMinuts)).intValue());
		} else
		{
		    return nbDays+" "+getDay_fr((new Long(nbDays)).intValue());
		}	    
	    }
	} else
	{
	    if(nbHours != 0)
	    {
		if(nbMinuts != 0)
		{
		    return nbHours+" "+getHour_fr((new Long(nbHours)).intValue())+" "+"et"+" "+nbMinuts+" "+getMinut_fr((new Long(nbMinuts)).intValue());
		} else
		{
		    return nbHours+" "+getHour_fr((new Long(nbHours)).intValue());
		}
	    } else
	    {
		return nbMinuts+" "+getMinut_fr((new Long(nbMinuts)).intValue());
	    }
	}
    }
    
    
    
    
    
    
    
    public static final Date getDate(int year, int month, int day, int hour,
        int minute) {
        // returns a Date with the specified time elements
        Calendar cal =
            new GregorianCalendar(year, intToCalendarMonth(month), day, hour,
                minute);

        return cal.getTime();
    } // getDate

    public static final Date getDate(int year, int month, int day) {
        // returns a Date with the specified time elements,
        // with the hour and minutes both set to 0 (midnight)
        Calendar cal =
            new GregorianCalendar(year, intToCalendarMonth(month), day);

        return cal.getTime();
    } // getDate

    static public final Date addDays(Date target, int days) {
        // returns a Date that is the sum of the target Date
        // and the specified number of days;
        // to subtract days from the target Date, the days
        // argument should be negative
        long msPerDay = 1000 * 60 * 60 * 24;
        long msTarget = target.getTime();
        long msSum = msTarget + (msPerDay * days);
        Date result = new Date();
        result.setTime(msSum);

        return result;
    } // addDays
/*
    static public int dayDiff(Date first, Date second) {
        // returns the difference, in days, between the first
        // and second Date arguments
        long msPerDay = 1000 * 60 * 60 * 24;
        long diff =
            (first.getTime() / msPerDay) - (second.getTime() / msPerDay);
        Long convertLong = new Long(diff);

        return convertLong.intValue();
    } // dayDiff
*/
    static public int getYear(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        return cal.get(Calendar.YEAR);
    } // getYear 

    static public int getMonth(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        int calendarMonth = cal.get(Calendar.MONTH);

        return calendarMonthToInt(calendarMonth);
    } // getMonth

    static public int getDay(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        return cal.get(Calendar.DAY_OF_MONTH);
    } // getDay

    static public int getHour(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        return cal.get(Calendar.HOUR_OF_DAY);
    } // geHour

    static public int getMinute(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        return cal.get(Calendar.MINUTE);
    } // geMinute

    private static int calendarMonthToInt(int calendarMonth) {
        if (calendarMonth == Calendar.JANUARY) {
            return 1;
        } else if (calendarMonth == Calendar.FEBRUARY) {
            return 2;
        } else if (calendarMonth == Calendar.MARCH) {
            return 3;
        } else if (calendarMonth == Calendar.APRIL) {
            return 4;
        } else if (calendarMonth == Calendar.MAY) {
            return 5;
        } else if (calendarMonth == Calendar.JUNE) {
            return 6;
        } else if (calendarMonth == Calendar.JULY) {
            return 7;
        } else if (calendarMonth == Calendar.AUGUST) {
            return 8;
        } else if (calendarMonth == Calendar.SEPTEMBER) {
            return 9;
        } else if (calendarMonth == Calendar.OCTOBER) {
            return 10;
        } else if (calendarMonth == Calendar.NOVEMBER) {
            return 11;
        } else if (calendarMonth == Calendar.DECEMBER) {
            return 12;
        } else {
            return 1;
        }
    } // calendarMonthToInt

    public static String format(Date date, String pattern) {
        // returns a String representation of the date argument,
        // formatted according to the pattern argument, which
        // has the same syntax as the argument of the SimpleDateFormat
        // class1E
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);

        return formatter.format(date);
    } // format

    private static int intToCalendarMonth(int month) {
        if (month == 1) {
            return Calendar.JANUARY;
        } else if (month == 2) {
            return Calendar.FEBRUARY;
        } else if (month == 3) {
            return Calendar.MARCH;
        } else if (month == 4) {
            return Calendar.APRIL;
        } else if (month == 5) {
            return Calendar.MAY;
        } else if (month == 6) {
            return Calendar.JUNE;
        } else if (month == 7) {
            return Calendar.JULY;
        } else if (month == 8) {
            return Calendar.AUGUST;
        } else if (month == 9) {
            return Calendar.SEPTEMBER;
        } else if (month == 10) {
            return Calendar.OCTOBER;
        } else if (month == 11) {
            return Calendar.NOVEMBER;
        } else if (month == 12) {
            return Calendar.DECEMBER;
        } else {
            return Calendar.JANUARY;
        }
    } // intToCalendarMonth
    
    public int getCurrentMonth()
    {
	return getMonth(new Date(System.currentTimeMillis()));
    }
    
    public int getCurrentYear()
    {
	return getYear(new Date(System.currentTimeMillis()));
    }
    public int getCurrentDay()
    {
	return getDay(new Date(System.currentTimeMillis()));
    }
    public int getCurrentHour()
    {
	return getHour(new Date(System.currentTimeMillis()));
    }

    public int getCurrentMinut()
    {
	return getMinute(new Date(System.currentTimeMillis()));
    }

    
    
} // class 
